REC & PRE

오차(ERR), 정확도(ACC) 모두 얼마나 많은 샘플을 잘못 분류했는지 일반적인 정보를 알려 준다.
오차는 잘못된 예측의 합을 전체 예측 샘플 개수로 나눈 것
정확도는 옳은 예측의 합을 전체 예측 샘플 개수로 나눈 것이다.

ACC=1-ERR
진짜 양성 비율(True Positive Rate, TPR)과 거짓 양성 비율(False Positive Rate, FPR)은 클래스 비율이 다른 경우 유용하다.

예를 들어 위의 종양 진단 문제에서 환자의 악성 종양을 감지하는데 관심이 있다.
음성 종양이 악성으로 분류되는 경우(FP)를 줄여야 한다.
FPR에 비해서 TPR은 전체 양성 샘플 중에서 올바르게 분류된 양성 샘플의 비율을 말한다.
재현율(REC)은 TPR의 다른 이름이다.( PRE=TPR=TP/P=TP/(FN+TP) )
PRE=TP/(TP+FP)
재현율(REC)을 최적화하면 악성 종양을 감지하지 못할 확률을 최소화하는데 도움이 된다.
하지만 건강한 사람도 악성 종양으로 예측하는 비용이 발생(높은 FP)

정밀도(PRE)를 최적화하면 악성 종양을 가졌는지 정확히 예측하게 되는데 도움이 된다.
하지만 악성 종양 확자를 자주 놓치는 결과를 초래(높은 FN)
F1-점수
PRE와 REC 최적화로 인한 장단점 균형을 맞추기 위해 PRE와 REC를 조합한 F1-점수를 자주 사용한다.

F1 = 2 X ( PRE X REC ) / ( PRE + REC ) 
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score, f1_score
print(': %.3f' %precision_score(y_true=y_test, y_pred=y_pred))
print(': %.3f' %recall_score(y_true=y_test, y_pred=y_pred))
print('F1: %.3f' %f1_score(y_true=y_test, y_pred=y_pred))

정밀도: 0.976

재현율: 0.952

F1: 0.964

사이킷런에서 양성 클래스는 레이블이 1인 클래스이다. 양성 레이블을 바꾸고 싶다면
make_scorer_ 함수의 pos_label 매개변수를 이용해서 바꿀 수 있다.
from sklearn.metrics import make_scorer, f1_score
scorer=make_scorer(f1_score, pos_label=0)
c_gamma_range=[0.01, 0.1, 1.0, 10.0]
param_grid=[{'svc__C':c_gamma_range, 'svc__kernel':['linear']}, {'svc__C':c_gamma_range, 'svc__gamma':c_gamma_range, 'svc__kernel':['rbf']}]
gs=GridSearchCV(estimator=pipe_svc, param_grid=param_grid, scoring=scorer, cv=10)
gs=gs.fit(X_train, y_train)
print(gs.best_score_)
print(gs.best_params_)

0.9861994953378878

{'svc__C': 10.0, 'svc__gamma': 0.01, 'svc__kernel': 'rbf'}